/**
* Created by jinxs on 14-6-26.
*  * 修改自easyUI
*/
(function ($) {

    var _cacheName = 'droppable';

    /**
    * @class 拖放组件
    * @constructor droppable
    * @summary 构造函数
    * @param [options] {Object|String} 组件配置参数|要调用的组件方法名
    * @param [param] {Object} 表示要调用的方法的参数
    * @example
    * // 构件组件
    * $('#div').droppable({
    *      axis:'h',
    *      onStopDrag: function(e){
    *          alert(this[0]==e.data.target[0]);
    *      }
    * });
    * // 调用组件方法options
    * $('#div').droppable("options");
    */
    $.fn.droppable = function (options, param) {
        if (this.length > 0 && typeof options == 'string') {
            return $.fn.droppable.methods[options](this.fire(), param);
        }
        return this.each(function () {
            var me = $(this);
            var state = me.data( _cacheName);

            options = options || {};
            if (state) {
                $.extend(state.options, options);
            } else {
                _init(me);
                me.data(_cacheName, {
                    options: $.extend({}, $.fn.droppable.defaults, me.parseUIConfig(), options)
                });
            }
        });
    };

    /**
    * 方法
    * @lends droppable.prototype
    */
    $.fn.droppable.methods = {
        /**
        * @summary 获得组件的配置对象
        * @name droppable#options
        * @function
        * @returns {Object} 组件的配置对象
        */
        options: function (jq) {
            return $.data(jq[0], _cacheName).options;
        },
        /**
        * @summary 启用拖放
        * @name droppable#enable
        * @function
        * @returns {jQuery} 方法调用者
        * @example
        * $('#div').droppable("enable")
        * 或
        * $('#div').droppable({disabled: false})
        */
        enable: function (jq) {
            return jq.each(function () {
                $(this).droppable({ disabled: false });
            });
        },
        /**
        * @summary 禁用拖放
        * @name droppable#disable
        * @function
        * @returns {jQuery} 方法调用者
        */
        disable: function (jq) {
            return jq.each(function () {
                $(this).droppable({ disabled: true });
            });
        }
    };
    /**
    * 默认配置
    * @lends droppable.prototype
    */
    $.fn.droppable.defaults = {
        /**
        *TODO:what is the options name
        */
        accept: null,
        /**
        * @type Boolean
        * @default false
        * @summary 是否禁用
        */
        disabled: false,
        /**
        * @summary 在对象拖进时触发的方法。
        * @event
        * @name droppable#onDragEnter
        * @param e {Object} 事件对象
        * @param source {Object} 数据源
        * @default emptyFn
        */
        onDragEnter: function (e, source) {
        },
        /**
        * @summary 在对象拖放时触发的方法。
        * @event
        * @name droppable#onDragOver
        * @param e {Object} 事件对象
        * @param source {Object} 数据源
        * @default emptyFn
        */
        onDragOver: function (e, source) {
        },
        /**
        * @summary 在对象拖出时中触发的方法。
        * @event
        * @name droppable#onDragLeave
        * @param e {Object} 事件对象
        * @param source {Object} 数据源
        * @default emptyFn
        */
        onDragLeave: function (e, source) {
        },
        /**
        * @summary 在对象拖放过程中触发的方法。
        * @event
        * @name droppable#onDrag
        * @param e {Object} 事件对象
        * @param source {Object} 数据源
        * @default emptyFn
        */
        onDrop: function (e, source) {
        }
    };

    var _init = function (target) {
        var options = target.data(_cacheName);

        target.addClass('droppable').bind('_dragenter', function (e, source) {
            options.onDragEnter.apply(this, [e, source]);
        }).bind('_dragleave', function (e, source) {
            options.onDragLeave.apply(this, [e, source]);
        }).bind('_dragover', function (e, source) {
           options.onDragOver.apply(this, [e, source]);
        }).bind('_drop', function (e, source) {
            options.onDrop.apply(this, [e, source]);
        });
    }
})(jQuery);
